const jwt = require('jsonwebtoken');
require('dotenv').config();

const SECRET_KEY = process.env.JWT_SECRET || 'your-secret-key';
const EXPIRES_IN = process.env.JWT_EXPIRES_IN || '24h';

console.log('JWT配置 - Secret Key长度:', SECRET_KEY ? SECRET_KEY.length : '未配置');
console.log('JWT配置 - 过期时间:', EXPIRES_IN);

// 生成token
exports.generateToken = (userId, username) => {
  try {
    const token = jwt.sign(
      { userId, username },
      SECRET_KEY,
      { expiresIn: EXPIRES_IN }
    );
    console.log(`生成token成功: 用户${username} (ID: ${userId})`);
    return token;
  } catch (error) {
    console.error('生成token失败:', error.message);
    throw new Error('生成认证令牌失败');
  }
};

// 验证token
exports.verifyToken = (token) => {
  // 首先检查token是否存在且有效
  if (!token || typeof token !== 'string' || !token.trim()) {
    console.error('无效的token: null, undefined或空字符串');
    return null;
  }
  
  try {
    const decoded = jwt.verify(token, SECRET_KEY);
    console.log('Token验证成功:', decoded);
    return decoded;
  } catch (error) {
    console.error('Token验证失败:', error.name, ':', error.message);
    // 输出不同类型的JWT错误
    if (error.name === 'TokenExpiredError') {
      console.error('Token已过期');
    } else if (error.name === 'JsonWebTokenError') {
      console.error('Token格式错误或签名无效');
    } else if (error.name === 'NotBeforeError') {
      console.error('Token尚未生效');
    }
    return null;
  }
};

// 从请求头获取token
exports.getTokenFromHeader = (req) => {
  try {
    // 安全获取headers
    const headers = req.headers || {};
    const authHeader = headers.authorization;
    
    // 添加日志记录
    if (!authHeader) {
      console.log('Authorization Header: Not Present');
      return null;
    }
    
    console.log('Authorization Header: Present');
    
    // 检查authHeader是否为字符串
    if (typeof authHeader !== 'string') {
      console.error('Authorization Header不是字符串类型:', typeof authHeader);
      return null;
    }
    
    // 检查是否是Bearer格式（先trim避免空白字符影响）
    if (!authHeader.trim().startsWith('Bearer ')) {
      console.log('Authorization Header格式: 不是Bearer格式');
      return null;
    }
    
    console.log('Authorization Header格式: Bearer格式');
    
    // 安全分割和提取token
    const trimmedHeader = authHeader.trim();
    const parts = trimmedHeader.split(' ');
    
    // 严格验证parts数组
    if (!Array.isArray(parts) || parts.length !== 2) {
      console.error('提取的Token: parts数组格式错误');
      return null;
    }
    
    const token = parts[1];
    
    // 严格验证token
    if (!token || typeof token !== 'string' || !token.trim()) {
      console.error('提取的Token: 无效或空');
      return null;
    }
    
    const trimmedToken = token.trim();
    console.log('提取的Token:', trimmedToken.length > 20 ? trimmedToken.substring(0, 20) + '...' : trimmedToken);
    return trimmedToken;
  } catch (error) {
    console.error('从请求头提取token时出错:', error.message);
    return null;
  }
};